#include "SymboleValue.h"
#include <stdlib.h>
#include "Valeur.h"

////////////////////////////////////////////////////////////////////////////////
template <class T> SymboleValue<T>::SymboleValue(Symbole s): //promotion(NULL)
	Symbole(s.getChaine()) {

	Valeur<T> *v;
	if (typeid(s.getChaine())==typeid(int)) {
		v=new Valeur<int>(atoi(s.getChaine().c_str()));
		defini = true;
		//type = ENTIER;
	}
//	if (typeid(*s.getChaine())==float) {
//	  cout << ((ValeurReelle*)v)->getValeur() << endl;
//	}
	//v=new ValeurChaine("salut");
	else if (typeid(s.getChaine())==typeid(string)) {
		v=new Valeur<string>(s.getChaine());
		defini = true;
		//type = CHAINE;
	}
//	if (typeid(*s.getChaine())==int) {
//		v=new ValeurEntiere(atoi(s.getChaine().c_str()));
//	}
	else {
//		v=new ValeurEntiere(0);
		v=NULL;
		defini = false;
	//	type = NULL;
	}

/*	if (s == "<ENTIER>") {
		this.valeur = atoi(s.getChaine().c_str()); // c_str convertit une string en char*

	}
	else if (s == "<FLOAT>") {
		valeur = atoi(s.getChaine().c_str()); // c_str convertit une string en char*
		defini = true;
		type = FLOAT;
	}
	else if (s == "<CHAINE>") {
		valeur = s; // c_str convertit une string en char*
		defini = true;
		type = CHAINE;
	}
	else if (s == "<CARACT>") {
		valeur = s; // c_str convertit une string en char*
		defini = true;
		type = CARACT;
	}
	else {
		valeur = 0;
		defini = false;
		type = NULL;
	}*/

	/*	Valeur *v;
	v=new ValeurEntiere(0);
	if (typeid(*s.getChaine())==typeid(ValeurEntiere)) {
		((ValeurEntiere*)s.getChaine())->getValeur(s.getChaine())
	}
	//v=new ValeurReelle(100.0);
	if (typeid(*s.getChaine())==typeid(ValeurReelle)) {
	  cout << ((ValeurReelle*)v)->getValeur() << endl;
	}
	//v=new ValeurChaine("salut");
	if (typeid(*s.getChaine())==typeid(ValeurChaine)) {
	  cout << ((ValeurChaine*)v)->getValeur() << endl;
	}
*/
}


template <class T> Valeur<T> SymboleValue<T>::getValeur()     { 
/* if (type == ENTIER)
    return valeur.ValeurEntiere::getValeur());                    
  if (type == CHAINE)
    return valeur.ValeurChaine::getValeur());  */
  return valeur.Valeur<T>::getValeur();
}


template <class T> void SymboleValue<T>::setValeur(Symbole s)
{
	Valeur<T> *v;
	if (typeid(s.getChaine())==typeid(int)) {
		v=new Valeur<int>(atoi(s.getChaine().c_str()));
			this->defini=true;
	}
//	if (typeid(*s.getChaine())==float) {
//	  cout << ((ValeurReelle*)v)->getValeur() << endl;
//	}
	//v=new ValeurChaine("salut");
	else if (typeid(s.getChaine())==typeid(string)) {
		v=new Valeur<string>(s.getChaine());
			this->defini=true;
	}
//	if (typeid(s.getChaine())==int) {
//		v=new ValeurEntiere(atoi(s.getChaine().c_str()));
//	}
	else {
		this->defini = false;
	//	type = NULL;
	}
	//this->valeur.setValeur(<int> val);
//	this->type=this->Symbole::categorie;
  } // accesseur

////////////////////////////////////////////////////////////////////////////////
template <class T> void SymboleValue<T>::afficher(unsigned short indentation) {
	Noeud<T>::afficher(indentation);
	cout << "Feuille - Symbole value : " << getChaine() << endl; // on affiche la chaine du symbole
}

////////////////////////////////////////////////////////////////////////////////
// Attention : cette fonction (operator) n'est pas membre de la classe SymboleValue
/*ostream & operator <<(ostream & cout, SymboleValue symb) {
	cout << (Symbole) symb << "\t\t - Valeur=";
	if (symb.defini)
		if (typeid(s.getChaine())==typeid(int)) {
			v=new ValeurEntiere(atoi(s.getChaine().c_str()));
		}
	//	if (typeid(*s.getChaine())==float) {
	//	  cout << ((ValeurReelle*)v)->getValeur() << endl;
	//	}
		//v=new ValeurChaine("salut");
		else if (typeid(s.getChaine())==typeid(string)) {
			v=new ValeurChaine(s.getChaine());
		}
	//	if (typeid(s.getChaine())==int) {
	//		v=new ValeurEntiere(atoi(s.getChaine().c_str()));
	//	}
		cout << ((ValeurReelle*)symb.valeur)->getValeur() << " ";
	//	cout << symb.valeur << " ";
	else
		cout << "indefinie ";
	return cout;
}*/
